package com.bjpowernode.crm.settings.web.controller;

import com.bjpowernode.crm.commons.contants.Contants;
import com.bjpowernode.crm.commons.domain.returnObject;
import com.bjpowernode.crm.commons.utils.DateUtils;
import com.bjpowernode.crm.settings.model.User;
import com.bjpowernode.crm.settings.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Controller
public class UserController {
    @Autowired
    UserService userService;
    /**
     * URL写的时候要和当前的Controller方法处理完请求之后，相应信息返回的页面所在的资源目录保持一致
     * @return 返回的页面
     */
    @RequestMapping("/settings/qx/user/ToLogin.do")
    public String ToLogin(){
//        请求转发到登陆页面
        return "settings/qx/user/login";
    }

    //    路径的命名方式，是按照返回的页面的资源路径，加上方法名然后跟上.do即可
    //    比如Login方法的返回资源是Login页面，而Login页面是login.jsp，这个页面在/setting/qx/user下，所以前缀是这个，而最后一个就是用方法名作为结尾，最后跟上.do
    @RequestMapping("/setting/qx/user/Login.do")
    @ResponseBody
    public Object Login(String loginAct, String loginPwd, String isRemPwd, HttpServletRequest request, HttpServletResponse response,HttpSession session) {
//        封装参数
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("loginAct",loginAct);
        map.put("loginPwd",loginPwd);
//        封装参数的原因是为了在后续的操作中方便操作，而后续的操作指的就是数据库的操作，而是否记住密码不属于数据库
//        的操作，所以isRemPwd不需要被封装进去
//        而这个map中的key的名字，要和数据库的映射文件中的参数的名字要保持一致才可以
        User user = userService.queryUserByLoginActAndLoginPwd(map);

//        创建公共返回值类型类对象
        returnObject returnObject = new returnObject();
//        根据查询结果，生成响应信息
        if(user == null){
//            user对象为空，表示用户名或密码错误，登陆失败
            returnObject.setCode("0");
            returnObject.setMessage("用户名或密码错误");
        }else {
//            user对象不为空，表示用户名或密码正确，进一步判断账号是否合法
//            首先是判断账号是否有效，判断失效时间与当前时间，如果失效时间大于当前时间，则表示账号依然可用
//            我们选择将当前日期格式化成字符串，然后进行字符串之前的比较
//            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//            String nowStr = sdf.format(new Date());
            String nowStr = DateUtils.formatDataTime(new Date());
//            字符串的对比使用compareTo方法，返回值大于零表示调用方法的字符串比参数字符串大
            if(nowStr.compareTo(user.getExpireTime()) > 0){
//                这里如果进入循环，则表示当前时间大于有效时间，登陆失败，失败的信息就是账号过期
                returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
                returnObject.setMessage("账号过期");
            }else if("0".equals(user.getLockState())){
//                如果账号没有过期，那么接下来就是判断账号是否启用
//                如果账号被锁定，则登录失败，返回失败状态码，返回失败信息是账号被锁定
                returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
                returnObject.setMessage("账号被锁定");
            } else if (!user.getAllowIps().contains(request.getRemoteAddr())) {
//                判断当前用户的登陆IP地址是否在常用的IP地址组当中
//                如果方法的返回值是true，则表示在，取反，则表示不在的时候
//                登陆失败，返回登陆失败的状态码，错误信息是IP受限
                returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
                returnObject.setMessage("IP地址受限");
            }else {
//                当前面的所有的判断都没有成功，也就是表示账号存在且合法，我们就让他登录成功！
//                生成登录成功地相应信息
                returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
//                将User保存到Session作用域中
                session.setAttribute(Contants.SESSION_USER,user);
//                实现记住密码
                if("true".equals(isRemPwd)){
                    System.out.println(isRemPwd);
                    for (Cookie cookie : request.getCookies()) {
                        System.out.println(cookie.getName());
                    }


                    Cookie act = new Cookie("loginAct", user.getLoginAct());
                    act.setMaxAge(10*24*60*60);
//                    修改Cookie的作用域为全服务器可见
                    act.setPath("/");
                    response.addCookie(act);
                    Cookie pwd = new Cookie("loginPwd", user.getLoginPwd());
                    pwd.setMaxAge(10*24*60*60);
                    //                    修改Cookie的作用域为全服务器可见
                    pwd.setPath("/");
                    response.addCookie(pwd);
                }else {
//                    如果这里没有选中记住密码，则表示不自动记录密码，则需要将Cookie删除
                    Cookie act = new Cookie("loginAct", "1");
                    act.setMaxAge(0);
                    //                    修改Cookie的作用域为全服务器可见
                    act.setPath("/");
                    response.addCookie(act);
                    Cookie pwd = new Cookie("loginPwd", "1");
                    pwd.setMaxAge(0);
                    //                    修改Cookie的作用域为全服务器可见
                    pwd.setPath("/");
                    response.addCookie(pwd);
                }
            }
        }
        return returnObject;
    }
    @RequestMapping("/setting/qx/user/LoginOut.do")
    public String LoginOut(HttpServletResponse response,HttpSession session){
//        清空Cookie，用的是之前在记住密码的时候写的当不记住密码的时候就删除这个Cookie的代码
        Cookie act = new Cookie("loginAct", "1");
        act.setMaxAge(0);
        //                    修改Cookie的作用域为全服务器可见
        act.setPath("/");
        response.addCookie(act);
        Cookie pwd = new Cookie("loginPwd", "1");
        pwd.setMaxAge(0);
        //                    修改Cookie的作用域为全服务器可见
        pwd.setPath("/");
        response.addCookie(pwd);
//        销毁Session，调用方法销毁Session
        session.invalidate();
        return "redirect:/"; // 借助SpringMVC进行重定向，翻译成response.send("/crm")
    }
}